//! Header for the class IVisitor
#ifndef IVISITOR_H
#define IVISITOR_H
//! Represents the interface of the Visitors (Visitor pattern)
/*!
	The class IVisitor is the interface for all visitors.
	It is able to visit Songs, Albums and MusicCollections.
	\class IVisitor
	\author Andreas Lehner
	\date 06.12.2012
*/
class Song;
class Album;
class MusicCollection;

class IVisitor {
public:
	//! DTor of class IVisitor
	/*!
		The destructor is virtual that destructors of derived classes
		are called.
	*/
	virtual ~IVisitor(){}
	//! Function to visit a Song.
	/*!
		This Function visits Songs and is implemented by all
		of the concrete visitors. All visitors do certain
		different actions on the passed Song.
		\param song The Song to be visited.
	*/
	virtual void Visit(Song * song) = 0;
	//! Function to visit an Album.
	/*!
		This Function visits Albums and is implemented by all
		of the concrete visitors. All visitors do certain
		different actions on the passed Album.
		\param album The Album to be visited.
	*/
	virtual void Visit(Album * album) = 0;
	//! Function to visit a MusicCollection.
	/*!
		This Function visits MusicCollection and is implemented by all
		of the concrete visitors. All visitors do certain
		different actions on the passed MusicCollection.
		\param collection The MusicCollection to be visited.
	*/
	virtual void Visit(MusicCollection * collection) = 0;
};

#endif